#include "connection.hpp"
#include <iostream>
#include <string>
#include <chrono>
using namespace std; 


void callback(rbmq::channel::ptr& chn, const string& consumer_tag, const mqNs::BasicProperties* bp, const string& msg_body) {
    cout << consumer_tag << "消费了消息：" << msg_body << endl;
    // 如果是手动确认，还需要在这里对消息进行确认
    chn->basicAck(bp->id());
}

// 通过命令行参数，来确定我们要绑定的队列名称
int main(int argc, char* args[]) {
    if (argc != 2) {
        cout << "Usage:\n\r" << args[0] << " your will binding's queue name\n" << endl;
        return 0; 
    }
    // 1、实例化异步工作线程对象
    rbmq::AsyncWorker::ptr _thread=std::make_shared<rbmq::AsyncWorker>();
    // 2、实例化连接对象
    rbmq::connection::ptr conn = make_shared<rbmq::connection>("127.0.0.1", 8888, _thread);
    // 连接服务器
    conn->connect();
    // 3、通过连接创建信道
    rbmq::channel::ptr chn = conn->openChannel();
    // 4、通过信道提供的服务完成所需业务
        // 1、声明一个交换机exchange1，交换机类型为广播模式
    google::protobuf::Map<std::string, std::string> temp_map;
    chn->declareExchange("exchange1", mqNs::ExchangeType::TOPIC, true, false, temp_map);
        // 2、声明两个队列queue1和queue2，
    chn->declareQueue("queue1", true, false, false, temp_map);
    chn->declareQueue("queue2", true, false, false, temp_map);
        // 3、绑定queue1和exchange1，binding_key为“queue1”
    chn->queueBinding("queue1", "exchange1", "queue1");
        // 3、绑定queue2和exchange1，binding_key为“news.music.#
    chn->queueBinding("queue2", "exchange1", "news.music.#");

    // 订阅队列的消息
    auto cb = std::bind(callback, chn, placeholders::_1, placeholders::_2, placeholders::_3);
    chn->basicConsumer("consumer1", args[1], false, cb);

    // 等待消息到来
    while (true) {
        this_thread::sleep_for(chrono::seconds(3));
        // sleep(1);
    }
    conn->closeChannel(chn);
    return 0;
}